package cn.design.realize;

import cn.design.model.Product;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author dlq
 * @description
 *       ConcreteSubject：具体主题（具体被观察者），该角色将有关状态存入具体观察者对象，在具体主题的内部状态发生改变时，给所有注册过的观察者发送通知
 *       这里是商店
 * @date 2020/10/14 11:28
 * @since 1.0
 */
public class ProductStore implements StoreSubject{

    //注册过的观察者
    private List<ProductObserver> productObservers;

    //商品缓存
    private Map<String, Product> map;

    public ProductStore() {
        this.productObservers = new ArrayList<>();
        this.map = new HashMap<>(8);
    }


    @Override
    public void addProductObserver(ProductObserver productObserver) {
        productObservers.add(productObserver);
    }

    @Override
    public List<ProductObserver> removeProductObserver(ProductObserver productObserver) {
//        Iterator<ProductObserver> iterator = productObservers.iterator();
//        while (iterator.hasNext()){
//            ProductObserver observer =  iterator.next();
//            if (productObserver.equals(observer)){
//                iterator.remove();
//            }
//        }
        productObservers.removeIf(productObserver::equals);
        return productObservers;
    }
    /**
     * @description   添加商品: 对外暴露并且通知给 观察者
     * @param operation
     * @param: product
     * @return void
     * @author dlq
     * @date 2020/10/14 13:53
     */
    public void notifyAddProduct(String operation,Product product){
        if (!map.containsKey(product.getName())){
            map.put(product.getName(),product);
            productObservers.forEach(observer ->{
                observer.onEvent(operation+"==="+product.toString());
            });
        }
    }
    /**
     * @description 修改商品价格: 对外暴露并且通知给 观察者
     * @param operation
     * @param: product
     * @return void
     * @author dlq
     * @date 2020/10/14 13:59
     */
    public void notifyProductUpdatePrice(String operation,Product product){
        if (map.get(product.getName()) != null){
            map.get(product.getName()).setPrice(product.getPrice());
            productObservers.forEach(observer ->{
                observer.onEvent(operation+"==="+map.get(product.getName()).toString());
            });
        }


    }
    //

}
